/*
 * uart.c
 * UART接口
 * 日期: 2019.9.7
 * 作者: 
 */

#include <stdio.h>
#include "uart_dev.h"

#include "serial_interface_linux.h"

//UART 读数据缓冲区
volatile uint8_t uartBuf[128];
volatile int head = 0;
volatile int tail  = 0;

SerialInterfaceLinux kSerial;

// void Uart_Isr(void)
// {
// 	USART_ClearITPendingBit(USART1, USART_IT_ORE);
// 	uartBuf[tail] = USART_ReceiveData(USART1);
// 	tail = (tail+1)%128;
// }


void Uart_Init(void) {
	std::string port_name = "/dev/ttyUSB0";
	uint32_t com_baudrate = 115200;
	kSerial.Open(port_name, com_baudrate);
	kSerial.SetReadCallback([](const char *data, size_t length) {
		// printf("Recv:");
		for (int i = 0; i < (int)length; i++)
		{
			uartBuf[tail] = data[i];
			// printf("0x%x ", uartBuf[tail]);
			tail = (tail+1)%128;
			// printf("0x%x ", (uint8_t)data[i]);
		}
		// printf("\n");
	});
}

void Uart_DeInit(void) {
	kSerial.Close();
}


void Uart_Flush(void)
{
	head = tail = 0;
}

int16_t Uart_Read(void)
{
	if(head != tail){
		uint8_t Data = uartBuf[head];
		head = (head + 1)%128;
		return Data;
	}else{
		return -1;
	}
}


void Uart_Send(uint8_t *buf , uint8_t len)
{
	uint32_t tx_len = 0;
	if (!kSerial.WriteToIo(buf, len, &tx_len)) {
		printf("Send error\n");
		return;
	}
	
	// printf("Send:");
	// for (int i = 0; i < len; i++)
	// {
	// 	printf("0x%x ", buf[i]);
	// }
	// printf("\n");

	// uint8_t i=0;
	// for(i=0; i<len; i++){
	// 	USART_SendData(USART1, buf[i]);
	// 	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
	// }
	// while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}


